﻿// Fence Repair POJ - 3253  挑战.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <queue>
#include <vector>


using namespace std;
//https://vjudge.csgrandeur.cn/problem/POJ-3253

/*
农场主约翰想修理牧场周围一小段栅栏。他测量了栅栏，发现需要 N 块木板（1 ≤ N ≤ 20,000 ），每块木板的长度为某个整数单位 Li（1 ≤ Li ≤ 50,000 ）。
然后，他购买一块长木板，长度刚好可以锯成 N 块木板（即长度为 Li 的长度之和）。FJ 忽略了 "切口"，即锯切时因锯屑而损失的额外长度；你也应该忽略它。
FJ 很遗憾地意识到他没有锯子来锯木头，于是他带着这块长木板来到农场主唐的农场，礼貌地问他是否可以借一把锯子。
农夫唐是个不折不扣的资本家，他没有借给约翰锯子，而是提出要向约翰收取木板上 N-1 个切口的费用。
切割一块木头的费用正好等于它的长度。切割一块长度为 21 的木板需要 21 美分。
农夫唐让农夫约翰决定切割木板的顺序和位置。帮助农夫约翰确定制作 N 块木板所能花费的最低金额。
农场主约翰知道，他可以按照不同的顺序切割木板，这样会产生不同的费用，因为切割出的中间木板长度不同。

输入
第 1 行 一个整数 N，木板的数量
第 2...N+1 行：每行包含一个描述所需木板长度的整数
输出
第 1 行 一个整数：切割 N-1 块木板所需的最低金额


3
8
5
8


34

提示
他想把一块长为 21 的木板切割成长为 8、5 和 8 的木块。
原木板的长度是 8+5+8=21。第一次切割的成本为 21，应将木板切割成长度为 13 和 8 的木块。
第二刀的成本为 13，应将 13 切成 8 和 5。这将花费 21+13=34 元。
如果将 21 分成 16 和 5，第二刀的成本为 16，总成本为 37（比 34 多）。
*/

const int N = 20010;
int arr[N];
int n;

priority_queue<int,vector<int> ,greater<int>> q;

int main()
{
	cin >> n;
	long long ans = 0;
	for (int i = 0; i < n; i++) {
		int t; cin >> t;
		q.push(t);
	}

	while (!q.empty()) {
		if (q.size() == 1) { break; }
		int a = q.top(); q.pop();
		int b = q.top(); q.pop();
		ans += (a + b);
		q.push(a + b);
	}

	cout << ans << endl;

	return 0;
}

 